home *** CD-ROM | disk | FTP | other *** search
- ;;; -*-Scheme-*-
-
- (define (sqrt-of a base)
- (do ((old 0) (xn (* a base base)) (an (* a base base)))
- ((equal? old xn) xn)
- (begin
- (set! old xn)
- (set! xn (quotient (+ xn (quotient an xn)) 2)))))
-
- ; pi = 9801/(sqrt(8) * sum(...))
- (define (rama base)
- (define (step n)
- (quotient (* base (* (fact (* 4 n)) (+ 1103 (* 26390 n))))
- (* (expt (fact n) 4) (expt 396 (* 4 n)))))
- (do ((i 0 (+ i 1))
- (sum 0 (+ sum delta))
- (delta 1 (step i)))
- ((zero? delta)
- sum)))
-
- (define (calc-pi-ramanujan base)
- (quotient (* base base base 9801) (* (sqrt-of 8 base) (rama base))))
-
- (define (fact n)
- (let f ((i n) (a 1))
- (if (zero? i)
- a
- (f (- i 1) (* a i)))))
-
- (define (square x) (* x x))
-
- (define base
- (let ((d (format #t "How many decimals of pi do you want (0 to exit): "))
- (num (read)))
- (if (and (not (eof-object? num)) (positive? num))
- (let* ((extra (+ 5 (truncate (log num)))))
- (cons (expt 10 (+ num extra)) extra)))))
-
- (define (print-pi pi base)
- (format #t "~a.~a~%"
- (quotient pi (car base))
- (quotient (remainder pi (car base)) (expt 10 (cdr base)))))
-
- (print-pi (calc-pi-ramanujan (car base)) base)
-